/*
 * Copyright 2023, Haiku, Inc. All rights reserved.
 * Distributed under the terms of the MIT License.
 */

#ifndef _LS7A2000_DEVICE_H
#define _LS7A2000_DEVICE_H

#include <KernelExport.h>
#include <PCI.h>
#include <OS.h>

#include "ls7a2000_private.h"

// 龙芯7A2000 GPU相关常量
#define VENDOR_ID_LOONGSON 0x0014
#define DEVICE_ID_LS7A2000_GPU 0x7a25

// 寄存器偏移量定义
#define LS7A_DC_FB_ADDR 0x0000     // 帧缓冲地址寄存器
#define LS7A_DC_FB_STRIDE 0x0008   // 帧缓冲行跨度寄存器
#define LS7A_DC_FB_ORIGIN 0x0010   // 帧缓冲原点寄存器
#define LS7A_DC_HDISPLAY 0x0020    // 水平显示寄存器
#define LS7A_DC_HSYNC 0x0024       // 水平同步寄存器
#define LS7A_DC_VDISPLAY 0x0028    // 垂直显示寄存器
#define LS7A_DC_VSYNC 0x002C       // 垂直同步寄存器
#define LS7A_DC_DMA_COUNT 0x0030   // DMA计数寄存器
#define LS7A_DC_DMA_START 0x0034   // DMA启动寄存器
#define LS7A_DC_CURSOR_ADDR 0x0040 // 光标地址寄存器
#define LS7A_DC_CURSOR_POS 0x0044  // 光标位置寄存器
#define LS7A_DC_CURSOR_BG 0x0048   // 光标背景色寄存器
#define LS7A_DC_CURSOR_FG 0x004C   // 光标前景色寄存器
#define LS7A_DC_CONFIG 0x0050      // 配置寄存器
#define LS7A_DC_INT_MASK 0x0054    // 中断掩码寄存器
#define LS7A_DC_INT_STATUS 0x0058  // 中断状态寄存器
#define LS7A_DC_REVISION 0x005C    // 版本寄存器
#define LS7A_DC_RESET 0x0060       // 复位寄存器
#define LS7A_DC_CLOCK 0x0064       // 时钟寄存器
#define LS7A_DC_GAMMA_INDEX 0x0070 // Gamma索引寄存器
#define LS7A_DC_GAMMA_DATA 0x0074  // Gamma数据寄存器
#define LS7A_DC_EDID_START 0x0080  // EDID起始寄存器
#define LS7A_DC_EDID_END 0x00FF    // EDID结束寄存器

// 配置寄存器位定义
#define LS7A_DC_CONFIG_ENABLE (1 << 0)      // 显示控制器使能
#define LS7A_DC_CONFIG_RESET (1 << 1)       // 显示控制器复位
#define LS7A_DC_CONFIG_GAMMA (1 << 2)       // Gamma校正使能
#define LS7A_DC_CONFIG_CURSOR (1 << 3)      // 硬件光标使能
#define LS7A_DC_CONFIG_HWCURSOR (1 << 4)    // 硬件光标模式
#define LS7A_DC_CONFIG_DITHER (1 << 5)      // 抖动使能
#define LS7A_DC_CONFIG_INTERLACE (1 << 6)   // 隔行扫描使能
#define LS7A_DC_CONFIG_HSYNC_POL (1 << 8)   // 水平同步极性
#define LS7A_DC_CONFIG_VSYNC_POL (1 << 9)   // 垂直同步极性
#define LS7A_DC_CONFIG_PLL_BYPASS (1 << 10) // PLL旁路

// 颜色深度定义
#define LS7A_DC_CONFIG_FORMAT_MASK (0x7 << 16)
#define LS7A_DC_CONFIG_FORMAT_8BPP (0 << 16)  // 8位每像素
#define LS7A_DC_CONFIG_FORMAT_16BPP (1 << 16) // 16位每像素
#define LS7A_DC_CONFIG_FORMAT_24BPP (2 << 16) // 24位每像素
#define LS7A_DC_CONFIG_FORMAT_32BPP (3 << 16) // 32位每像素

// 中断位定义
#define LS7A_DC_INT_VSYNC (1 << 0)      // 垂直同步中断
#define LS7A_DC_INT_FIFO_EMPTY (1 << 1) // FIFO空中断
#define LS7A_DC_INT_FIFO_FULL (1 << 2)  // FIFO满中断

// 设备信息结构
typedef struct
{
    uint32 is_open;              // 设备打开计数
    area_id shared_area;         // 共享区域ID
    ls7a2000_shared_info *si;    // 共享信息指针
    vuint32 *regs;               // 寄存器映射指针
    pci_info pcii;               // PCI信息
    char name[B_OS_NAME_LENGTH]; // 设备名称
} device_info;

// 设备数据结构
typedef struct
{
    uint32 count;                                 // 设备计数
    benaphore kernel;                             // 内核信号量
    char *device_names[MAX_LS7A2000_DEVICES + 1]; // 设备名称数组
    device_info di[MAX_LS7A2000_DEVICES];         // 设备信息数组
} DeviceData;

// 函数声明
status_t device_init(device_info *di);
void device_uninit(device_info *di);
status_t device_open(device_info *di, uint32 flags);
status_t device_close(device_info *di);
status_t device_free(device_info *di);
status_t device_read(device_info *di, off_t pos, void *buf, size_t *len);
status_t device_write(device_info *di, off_t pos, const void *buf, size_t *len);
status_t device_ioctl(device_info *di, uint32 cmd, void *buf, size_t len);

#endif // _LS7A2000_DEVICE_H